using Vin.Extension.Win32.Command.Workflow;
using Vin.Tool.AspNetCore.Singleton;

namespace Vin.Extension.Win32.Command.Node;

public interface INode : IDisposable
{
    public Task ExecuteAsync(INodeContext context, IWorkflowContext workflowContext);

    internal async Task InvokeAsync(INodeContext context, IWorkflowContext workflowContext)
    {
        // 修改当前输入端口的状态
        context.ChangeInputPort();
        // 如果执行的不是第一个输入端口的节点，则直接返回
        if (context.Port != 0) return;

        // 1. 判断是否有未输入的输入节点
        var haveNotInputPort = context.HaveNotInputPort();
        foreach (var inputPort in haveNotInputPort)
        {
            var inputPortNodeGroup = workflowContext.WorkflowData.GetNodeGroup(context.GetNodeIdByInputPort(inputPort));
            if (inputPortNodeGroup != null)
            {
                await WorkflowManager.ExecuteNodeGroup(inputPortNodeGroup);
            }
        }

        // 2. 执行当前节点
        await ExecuteAsync(context, workflowContext);

        // 3. 判断是否有下一个节点
        if (context.HaveNextNode)
        {
            await WorkflowManager.ExecuteNodeGroup(context.NodeInput.Next!);
        }
    }
}